﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ComponentModel.DataAnnotations;
using System.Configuration;
using System.Data;
using System.Web.Mvc;
using DataAnnotationsExtensions;

namespace MobiShop.Models
{
    [MetadataType(typeof(AdminProduct))]
    public partial class Product { }
    public class AdminProduct
    {
        [Required(ErrorMessage = "Tên sản phẩm phải khác trống")]
        [Display(Name = "Tên sản phẩm:")]
        public string name { get; set; }

        [Required(ErrorMessage = "Giá phải khác trống")]
        [Display(Name = "Giá:")]
        [Range(0, (double)decimal.MaxValue, ErrorMessage = "Giá phải >=0")]
        public decimal? price { get; set; } // float => decimal?

        [Display(Name = "Mô tả:")]
        [DataType(DataType.MultilineText)]
        public string description { get; set; }

        [Display(Name = "Mô tả chi tiết:")]
        [DataType(DataType.MultilineText)]
        public string fullDescription { get; set; }

        //[Required(ErrorMessage = "Hình ảnh phải khác trống")]
        [Display(Name = "Hình ảnh:")]
        public string image { get; set; }//  string 

        //public HttpPostedFileBase file { get; set; }

        [Display(Name = "Ngày tạo:")]
        [Required(ErrorMessage = "Ngày tạo phải khác trống")]
        [DataType(DataType.Date)]
        public DateTime? createDate { get; set; } // DateTime?

        [Display(Name = "Lượt xem:")]
        public int totalView { get; set; }

        [Display(Name = "Lượt bán:")]
        public int totalSale { get; set; }

        [Display(Name = "Số lượng:")]
        [Required(ErrorMessage = "Số lượng phải là số nguyên lớn hơn 0 hợp lệ")]
        [RegularExpression(@"^\d+$", ErrorMessage="Số lượng phải là số nguyên lớn hơn 0 hợp lệ")]
        [Range(0, int.MaxValue, ErrorMessage = "Số lượng phải là số nguyên lớn hơn 0 hợp lệ")]
        public int totalQuantity { get; set; }

        [Display(Name = "Nhà sản xuất:")]
        public int? manufactureId { get; set; } // int?

        [Display(Name = "Loại sản phẩm:")]
        public int? categoryId { get; set; } // int?

        [Display(Name = "Kích hoạt:")]
        public bool? visible { get; set; } // bool?

        [Display(Name = "Xuất xứ:")]
        public int? regionId { get; set; } // int?
    }

    [MetadataType(typeof(AdminCategory))]
    public partial class Category { }
    public class AdminCategory
    {
        [Required(ErrorMessage = "Tên loại sản phẩm phải khác trống")]
        [Display(Name = "Tên loại sản phẩm:")]
        public string name { get; set; }

        [Required(ErrorMessage = "Vị trí hiển thị phải khác trống")]
        [DefaultSettingValue("0")]
        [Display(Name = "Vị trí:")]
        public int? position { get; set; } //int?

        [Display(Name = "Kích hoạt:")]
        public bool? visible { get; set; }
    }

    [MetadataType(typeof(AdminRegion))]
    public partial class Region { }
    public class AdminRegion
    {
        [Required(ErrorMessage = "Xuất xứ phải khác trống")]
        [Display(Name = "Xuất xứ:")]
        public string name { get; set; }

        [Display(Name = "Vị trí:")]
        public int? position { get; set; } 
    }

    [MetadataType(typeof(AdminManufacture))]
    public partial class Manufacture { }
    public class AdminManufacture
    {
        [Required(ErrorMessage = "Tên nhà sản xuất phải khác trống")]
        [Display(Name = "Tên nhà sản xuất:")]
        public string name { get; set; }

        [Required(ErrorMessage = "Vị trí hiển thị phải khác trống")]
        [DefaultSettingValue("0")]
        [Display(Name = "Vị trí:")]
        public int? position { get; set; } 

        [Display(Name = "Logo:")]
        public string LogoURL { get; set; }

        [Display(Name = "Kích hoạt:")]
        public bool? visible { get; set; }
    }

    [MetadataType(typeof(AdminAccount))]
    public partial class Account { }
    public class AdminAccount
    {
        [Required(ErrorMessage = "Họ và tên phải khác trống")]
        [Display(Name = "Họ và tên:")]
        [RegularExpression(@"^[\D]*$", ErrorMessage = "Họ và tên không được chứa số")]
        [StringLength(200, ErrorMessage = "Họ và tên không được quá 200 ký tự!")]
        public string name { get; set; }

        [Display(Name = "Địa chỉ :")]
        //[StringLength(500, ErrorMessage = "Địa chỉ không được quá 500 ký tự!")]
        [DataType(DataType.MultilineText)]
        public string address { get; set; }

        [Display(Name = "Ngày sinh:")]
        [Date(ErrorMessage="Ngày sinh phải là ngày tháng năm hợp lệ")]
        public DateTime? birthday { get; set; } // DateTime?

        [Display(Name = "Điện thoại: ")]
        //[StringLength(15, MinimumLength = 6, ErrorMessage = "Số điện thoại phải từ 6 đến 15 ký tự")]
        [DataType(DataType.PhoneNumber, ErrorMessage = "Số điện thoại phải là 1 dãy số hợp lệ.VD: 0986754322")]
        [RegularExpression(@"^[\d- ]*[\d]{3,}[\d- ]*$", ErrorMessage = "Số điện thoại phải là 1 dãy số hợp lệ.VD: 0986754322")]
        public string phoneNumber { get; set; }

        [Required(ErrorMessage = "Tên đăng nhập phải khác trống")]
        [Display(Name = "Tên đăng nhập:")]
        [StringLength(20, MinimumLength = 3, ErrorMessage = "Tên đăng nhập phải có từ 3 đến 20 ký tự")]
        public string username { get; set; }

        [Required(ErrorMessage = "Mật khẩu phải khác trống")]
        [Display(Name = "Mật khẩu:")]
        //[StringLength(30, MinimumLength = 3, ErrorMessage = "Mật khẩu phải có từ 3 đến 30 ký tự")]
        [DataType(DataType.Password)]
        public string password { get; set; }

        [Required(ErrorMessage = "Email phải khác trống")]
        [Display(Name = "Email:")]
        [StringLength(200, ErrorMessage = "Email không được quá 200 ký tự")]
        [DataType(DataType.EmailAddress)]
        [RegularExpression(@"^\w+(\.\w+)*@\w+(\.\w+)*\.[a-zA-Z]{2,4}$", ErrorMessage = "Email phải là địa chỉ email hợp lệ")]
        public string email { get; set; }

        [Required(ErrorMessage = "Vai trò phải khác trống")]
        [Display(Name = "Vai trò:")]
        public byte role { get; set; } // byte, not int!

        [Display(Name = "Credit Card Number:")]
        public string creditCardNumber { get; set; }

        [Display(Name = "Kích hoạt:")]
        public bool? visible { get; set; } // bool?
    }

    // hoàng
    public class FindOrderData
    {
        [Display(Name = "Mã tài khoản:")]
        [RegularExpression(@"^\d+$", ErrorMessage = "Mã tài khoản phải là số nguyên lớn hơn 0 hợp lệ")]
        public int? Account_id { get; set; }

        [Display(Name = "Tên tài khoản:")]
        public string Account_username { get; set; }

        [Display(Name = "Tên người nhận:")]
        public string receiveName { get; set; }

        [Display(Name = "Địa chỉ:")]
        public string receiveAddress { get; set; }

        [Display(Name = "Điện thoại:")]
        [RegularExpression(@"^ *\d+ *$", ErrorMessage = "Số điện thoại phải là 1 dãy số hợp lệ.VD: 0986754322")]
        public string receivePhoneNumber { get; set; }

        [Display(Name = "CMND:")]
        [RegularExpression(@"^ *\d+ *$", ErrorMessage = "CMND phải là 1 dãy số hợp lệ.")]
        public string receiveIdentityCardNumber { get; set; }

        [Display(Name = "Ngày mua từ:")]
        [Date(ErrorMessage = "Ngày bắt đầu phải là ngày tháng hợp lệ")]
        public DateTime? orderDate_From { get; set; }

        [Display(Name = "đến:")]
        [Date(ErrorMessage = "| Ngày kết thúc phải là ngày tháng hợp lệ")]
        public DateTime? orderDate_To { get; set; }

        [Display(Name = "Ngày nhận từ:")]
        [Date(ErrorMessage = "Ngày bắt đầu phải là ngày tháng hợp lệ")]
        public DateTime? receiveDate_From { get; set; }

        [Display(Name = "đến:")]
        [Date(ErrorMessage = "| Ngày kết thúc phải là ngày tháng hợp lệ")]
        public DateTime? receiveDate_To { get; set; }

        [Display(Name = "Số tiền từ:")]
        [RegularExpression(@"^\d+$", ErrorMessage = "Số tiền từ phải là số nguyên >= 0 hợp lệ")]
        //[Integer(ErrorMessage = "Số tiền từ phải là số nguyên >= 0 hợp lệ")]
        public decimal? totalPayment_From { get; set; }

        [Display(Name = "đến:")]
        [RegularExpression(@"^\d+$", ErrorMessage = "| Số tiền đến phải là số nguyên >= 0 hợp lệ")]
        //[Integer(ErrorMessage = "| Số tiền đến phải là số nguyên >= 0 hợp lệ")]
        public decimal? totalPayment_To { get; set; }

        [Display(Name = "Trạng thái:")]
        public int? OrderStatusId { get; set; }

        [Display(Name = "Tình trạng:")]
        public bool? visible { get; set; }

        public FindOrderData() { }

        public IQueryable<Order> Find(MobishopEntities db)
        {
            
            //var orderlist = db.OrderList.Include("Account").Include("OrderStatus");


            var orderlist = from s in db.OrderList.Include("Account").Include("OrderStatus")
                            select s;
            // tiến hành lọc theo các tiêu chí tìm kiếm:
            if (OrderStatusId != null && OrderStatusId!=0)
                orderlist = orderlist.Where(s => s.orderStatusId == OrderStatusId);
            if (visible != null)
            {
                if ((bool)visible)
                    orderlist = orderlist.Where(s => s.visible == true);
                else
                    orderlist = orderlist.Where(s => s.visible == false || s.visible == null);
            }

            if (Account_id != null)
                orderlist = orderlist.Where(s => s.customerId == Account_id);
            if (Account_username != null)
                orderlist = orderlist.Where(s => s.Account.username.Contains(Account_username));
            if (receiveName != null)
                orderlist = orderlist.Where(s => s.receiveName.Contains(receiveName));
            if (receiveAddress != null)
                orderlist = orderlist.Where(s => s.receiveAddress.Contains(receiveAddress));
            if (receivePhoneNumber != null)
                orderlist = orderlist.Where(s => s.receivePhoneNumber.Contains(receivePhoneNumber));
            if (receiveIdentityCardNumber != null)
                orderlist = orderlist.Where(s => s.receiveIdentityCardNumber.Contains(receiveIdentityCardNumber));
            
            if (orderDate_From != null)
                orderlist = orderlist.Where(s => s.orderDate >= orderDate_From);
            if (orderDate_To != null)
                orderlist = orderlist.Where(s => s.orderDate <= orderDate_To);

            if (receiveDate_From != null)
                orderlist = orderlist.Where(s => s.receiveDate >= receiveDate_From);
            if (receiveDate_To != null)
                orderlist = orderlist.Where(s => s.receiveDate <= receiveDate_To);

            if (totalPayment_From != null)
                orderlist = orderlist.Where(s => s.totalPayment >= totalPayment_From);
            if (totalPayment_To != null)
                orderlist = orderlist.Where(s => s.totalPayment <= totalPayment_To);
            return orderlist;
        }
    }
}